package services.impl;

import java.rmi.RemoteException;
import java.util.List;

import rmi.ClienteRMI;
import services.CotizacionService;
import services.OrdenCompraService;
import services.RodamientoService;
import services.XMLService;
import conexionRemota.ConexionRemota;
import dao.CotizacionDAO;
import dao.impl.CotizacionDAOImpl;
import dominio.Cotizacion;
import dominio.Factura;
import dominio.Item;
import dominio.ListaPrecios;
import dominio.Rodamiento;


public class CotizacionServiceImpl implements CotizacionService {

	/**
	 * 
	 */
	
	private CotizacionDAO cDAO;	
	private static CotizacionServiceImpl instancia = null;
	
	private CotizacionServiceImpl(){
		cDAO = CotizacionDAOImpl.getInstancia();
	}
	
	public static CotizacionServiceImpl getInstancia(){
		if(instancia == null){
			instancia = new CotizacionServiceImpl();
		}
		return instancia;
	}
	
	public Cotizacion findByID(Integer id){
		return cDAO.findByID(id);
	}

	@Override
	public List<Cotizacion> getAll() {
		return cDAO.getAll();
	}

	@Override
	public void grabarCotizacion(Cotizacion cot) {
		cDAO.grabarCotizacion(cot);
	}
	@Override
	public Cotizacion getCotizacion(List<Item> items) {
		ConexionRemota cRemota = ClienteRMI.getInstancia();
		Cotizacion cot = new Cotizacion();
		XMLService xmlService= cRemota.getXMLService();
		List<ListaPrecios> listas;
		try {
			listas = xmlService.leerXML();
			listas.addAll(xmlService.leerXmlLOF());
			for (Item itemCot : items) {
				itemCot.setCantidadSatisfecha(0);
				itemCot.setPrecio((float) 999999999);
				for (ListaPrecios lista : listas) {
					int itemIndice =  lista.getItems().indexOf(itemCot);
					if (itemIndice >= 0){
						Item itemLista = lista.getItems().get(itemIndice);
						RodamientoService rodService = RodamientoServiceImpl.getInstancia();
						Rodamiento rod = rodService.findByID(itemCot.getRodamiento().getCodigoSKF());
						if (itemLista.getPrecio()<=itemCot.getPrecio()){
							if(rod.getStock()>=itemCot.getCantidadSatisfecha()){//Primero, si el stock que tengo en casa central es mayora lo satisfecho, lo seteo
								if (rod.getStock()>itemCot.getCantidad()){//Garantiza que la cantidad maxima va a ser la que el cliente necesita
									itemCot.setCantidadSatisfecha(itemCot.getCantidad());	
								}else{
									itemCot.setCantidadSatisfecha(rod.getStock());
								}
								itemCot.setPrecio(itemLista.getPrecio());
								itemCot.setNombreLista(itemLista.getNombreLista());
								itemCot.setIsOferta(itemLista.getIsOferta());
								itemCot.setProveedor(lista.getProveedor());
							}
						}
						if (itemLista.getPrecio()<=itemCot.getPrecio()){
							if(itemLista.getCantidad()>=itemCot.getCantidadSatisfecha()){//Segundo, si la cantidad que me pueden proveer es mayor a la satisfecha que tiene el item, lo seteo
								if (itemLista.getCantidad()>itemCot.getCantidad()){//Garantiza que la cantidad maxima va a ser la que el cliente necesita
									itemCot.setCantidadSatisfecha(itemCot.getCantidad());	
								}else{
									itemCot.setCantidadSatisfecha(itemLista.getCantidad());
								}
								itemCot.setPrecio(itemLista.getPrecio());
								itemCot.setNombreLista(itemLista.getNombreLista());
								itemCot.setIsOferta(itemLista.getIsOferta());
								itemCot.setProveedor(lista.getProveedor());
							}
						}					
					}
				}
			}
			cot.setItems(items);
			cot.setIsAceptada(new Boolean(false));
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cot;
	}

	@Override
	
	public Factura aceptarCotizacion(Cotizacion cot) {
		Factura fac = null;
		ConexionRemota cRemota = ClienteRMI.getInstancia();
		OrdenCompraService ocService = cRemota.getOrdenCompraService();
		try {
			fac = ocService.generarOC(cot);
			cot.setIsAceptada(new Boolean(true));
			cDAO.actualizar(cot);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return fac;
	}

	@Override
	public void rechazarCotizacion(Cotizacion cot) {
		//Cotizacion c = cDAO.findByID(cot.getId());
		cot.setIsAceptada(new Boolean(false));
		cDAO.actualizar(cot);
	}

	@Override
	public Cotizacion findUltimaGuardada() {
		return cDAO.findUltimaGuardada();
	}
	
}
